flutter

您所在的位置:网站首页 flutter await返回慢 flutter

flutter

#flutter| 来源: 网络整理| 查看: 265

目前为止,阿里云官方并没有dart版本的oss sdk,所以才开发了这个插件flutter_oss_aliyun提供对oss sdk的支持。

flutter_oss_aliyun

一个访问阿里云oss并且支持STS临时访问凭证访问OSS的flutter库,基本上涵盖阿里云oss sdk的所有功能。⭐

flutter pub: pub.dev/packages/fl…

github : github.com/huhx/flutte…

oss sts document: help.aliyun.com/document_de…

🐱  初始化Client

添加依赖

dependencies: flutter_oss_aliyun: ^6.2.2 复制代码 初始化oss client, 这里我们提供两种方式 1. 提供sts server地址,需要后端添加这个api Client.init( stsUrl: "server url get sts token", ossEndpoint: "oss-cn-beijing.aliyuncs.com", bucketName: "bucket name", ); 复制代码

后端api至少需要返回以下数据:

{ "AccessKeyId": "AccessKeyId", "AccessKeySecret": "AccessKeySecret", "SecurityToken": "SecurityToken", "Expiration": "2022-03-22T11:33:06Z" } 复制代码 2. 自定义authGetter得到Auth Client.init( ossEndpoint: "oss-cn-beijing.aliyuncs.com", bucketName: "bucketName", authGetter: _authGetter ); Auth _authGetter() { return Auth( accessKey: "accessKey", accessSecret: 'accessSecret', expire: '2023-02-23T14:02:46Z', secureToken: 'token', ); } 复制代码

你可以传入自定义的Dio

在init函数中,你可以传入dio,做到dio的定制化。比如日志或者其他的interceptors.

Client.init( stsUrl: "server url get sts token", ossEndpoint: "oss-cn-beijing.aliyuncs.com", bucketName: "bucket name", dio: Dio(BaseOptions(connectTimeout: 9000)), ); 复制代码 🎨 使用 文件上传 追加文件上传 跨bucket文件复制 取消文件上传 批量文件上传 本地文件上传 批量本地文件上传 文件下载 文件下载并保存 文件删除 批量文件删除 获取已签名的文件url 获取多个已签名的文件url 列举所有的存储空间 列举存储空间中所有文件 获取bucket信息 获取bucket的储容量以及文件数量 获取文件元信息 regions的查询 bucket acl的操作 bucket policy的操作 文件上传

关于callback的使用: help.aliyun.com/document_de…

final bytes = "file bytes".codeUnits; await Client().putObject( bytes, "test.txt", option: PutRequestOption( onSendProgress: (count, total) { print("send: count = $count, and total = $total"); }, onReceiveProgress: (count, total) { print("receive: count = $count, and total = $total"); }, override: false, aclModel: AclMode.publicRead, storageType: StorageType.ia, headers: {"cache-control": "no-cache"}, callback: Callback( callbackUrl: "callback url", callbackBody: "{\"mimeType\":\${mimeType}, \"filepath\":\${object},\"size\":\${size},\"bucket\":\${bucket},\"phone\":\${x:phone}}", callbackVar: {"x:phone": "android"}, calbackBodyType: CalbackBodyType.json, ), ), ); 复制代码

PutRequestOption 字段说明,字段皆为非必需

FiledDefault valueDescriptionoverridetruetrue: 允许覆盖同名Objectfalse: 禁止覆盖同名ObjectaclModelinherited1. publicWrite: 任何人(包括匿名访问者)都可以对该Object进行读写操作2. publicRead: 只有该Object的拥有者可以对该Object进行写操作,任何人(包括匿名访问者)都可以对该Object进行读操作3. private: 只有Object的拥有者可以对该Object进行读写操作,其他人无法访问该Object4. inherited: 该Object遵循Bucket的读写权限,即Bucket是什么权限,Object就是什么权限参考文档: help.aliyun.com/document_de…storageTypeStandard参考文档: help.aliyun.com/document_de… 追加文件上传 final Response resp = await Client().appendObject( Uint8List.fromList(utf8.encode("Hello World")), "test_append.txt", ); final Response resp2 = await Client().appendObject( position: int.parse(resp.headers["x-oss-next-append-position"]?[0]), Uint8List.fromList(utf8.encode(", Fluter.")), "test_append.txt", ); 复制代码 跨bucket复制文件 final Response resp = await Client().copyObject( const CopyRequestOption( sourceFileKey: 'test.csv', targetFileKey: "test_copy.csv", targetBucketName: "bucket_2" ), ); 复制代码 取消文件上传 final CancelToken cancelToken = CancelToken(); final bytes = ("long long bytes" * 1000).codeUnits; Client().putObject( Uint8List.fromList(utf8.encode(string)), "cancel_token_test.txt", cancelToken: cancelToken, option: PutRequestOption( onSendProgress: (count, total) { if (kDebugMode) { print("send: count = $count, and total = $total"); } if (count > 56) { cancelToken.cancel("cancel the uploading."); } }, ), ).then((response) { // success print("upload success = ${response.statusCode}"); }).catchError((err) { if (CancelToken.isCancel(err)) { print("error message = ${err.message}"); } else { // handle other errors } }); 复制代码 批量文件上传 await Client().putObjects([ AssetEntity( filename: "filename1.txt", bytes: "files1".codeUnits, option: PutRequestOption( onSendProgress: (count, total) { print("send: count = $count, and total = $total"); }, onReceiveProgress: (count, total) { print("receive: count = $count, and total = $total"); }, aclModel: AclMode.private, ), ), AssetEntity(filename: "filename2.txt", bytes: "files2".codeUnits), ]); 复制代码 本地文件上传 final Response resp = await Client().putObjectFile( "/Users/aaa.pdf", fileKey: "aaa.png", option: PutRequestOption( onSendProgress: (count, total) { print("send: count = $count, and total = $total"); }, onReceiveProgress: (count, total) { print("receive: count = $count, and total = $total"); }, aclModel: AclMode.private, ), ); 复制代码 批量本地文件上传 final List resp = await Client().putObjectFiles( [ AssetFileEntity( filepath: "//Users/private.txt", option: PutRequestOption( onSendProgress: (count, total) { print("send: count = $count, and total = $total"); }, onReceiveProgress: (count, total) { print("receive: count = $count, and total = $total"); }, override: false, aclModel: AclMode.private, ), ), AssetFileEntity( filepath: "//Users/splash.png", filename: "aaa.png", option: PutRequestOption( onSendProgress: (count, total) { print("send: count = $count, and total = $total"); }, onReceiveProgress: (count, total) { print("receive: count = $count, and total = $total"); }, override: true, ), ), ], ); 复制代码 文件下载 await Client().getObject( "test.txt", onReceiveProgress: (count, total) { debugPrint("received = $count, total = $total"); }, ); 复制代码 文件下载并保存 await Client().downloadObject( "test.txt", "./example/test.txt", onReceiveProgress: (count, total) { debugPrint("received = $count, total = $total"); }, ); 复制代码 文件删除 await Client().deleteObject("test.txt"); 复制代码 批量文件删除 await Client().deleteObjects(["filename1.txt", "filename2.txt"]); 复制代码 获取已签名的文件url

需要注意的是: 这个操作并不安全,因为url包含security-token信息,即使过期时间比较短. 这个url可以直接在浏览器访问

final String url = await Client().getSignedUrl("filename1.txt"); 复制代码 获取多个已签名的文件url

需要注意的是: 这个操作并不安全,因为url包含security-token信息,即使过期时间比较短

final Map result = await Client().getSignedUrls(["test.txt", "filename1.txt"]); 复制代码 列举所有的存储空间

列举请求者拥有的所有存储空间(Bucket)。您还可以通过设置prefix、marker或者max-keys参数列举满足指定条件的存储空间。参考: help.aliyun.com/document_de…

final Response resp = await Client().listBuckets({"max-keys": 2}); 复制代码 列举存储空间中所有文件

接口用于列举存储空间(Bucket)中所有文件(Object)的信息。请求参数和返回结果,请参考: help.aliyun.com/document_de…

final Response resp = await Client().listFiles({}); 复制代码 获取bucket信息

查看存储空间(Bucket)的相关信息。返回结果请参考: help.aliyun.com/document_de…

final Response resp = await Client().getBucketInfo(); 复制代码 获取bucket的储容量以及文件数量

获取指定存储空间(Bucket)的存储容量以及文件(Object)数量。返回结果请参考: help.aliyun.com/document_de…

final Response resp = await Client().getBucketStat(); 复制代码 获取文件元信息 final Response resp = await Client().getObjectMeta("huhx.csv"); 复制代码 regions的查询 查询所有 final Response resp = await Client().getAllRegions(); 复制代码 查询特定 final Response resp = await Client().getRegion("oss-ap-northeast-1"); 复制代码 bucket acl的操作 查询 final Response resp = await Client().getBucketAcl( bucketName: "bucket-name", ); 复制代码 更新 final Response resp = await Client().putBucketAcl( AciMode.publicRead, bucketName: "bucket-name", ); 复制代码 bucket policy的操作 查询 final Response resp = await Client().getBucketPolicy( bucketName: "bucket-name", ); 复制代码 更新 final Response resp = await Client().putBucketPolicy( {}, bucketName: "bucket-name", ); 复制代码 删除 final Response resp = await Client().deleteBucketPolicy( bucketName: "bucket-name", ); 复制代码


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3